package lectureFichier;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import plateau.FabriquePlateau;
import plateau.Plateau;
import analyseEvolutionPlateau.AnalyseEvolution;
import analyseEvolutionPlateau.ResultatAnalyse;

/**
 * Class ayant pour but de chercher dans un dossier tout les fichiers, d'essayer
 * de les lire pour les transformer en plateau et le cas echéant de les analyser
 * pour retourner une liste des resultats.
 */
public class LectureDossier {

	/**
	 * fonction qui parcourt récursivement tout les sous-repertoires d'un
	 * repertoire donné en paramètre en analysant tout les fichiers que la
	 * FabriquePlateau arrivera à transformer en plateau
	 * 
	 * @param nomDossier
	 *            nom du repertoire à explorer
	 * @param duree
	 *            nombre d'étape pendant le quel un fichier peut être analysé avant de
	 *            retourner resultatIndetermine
	 * @param fabriquePlateau
	 *            FabriquePlateau qui sera utilisé sur les fichier
	 * @param analyseEvolution
	 *            AnalyseEvolution qui sera utilisé sur les plateaux que
	 *            fabriquePlateau aura pû créer
	 * @return la liste des resultats obtenus
	 */
	public static List<ResultatAnalyse> analyserDossier(String nomDossier, int duree,
			FabriquePlateau fabriquePlateau, AnalyseEvolution analyseEvolution) {
		List<ResultatAnalyse> retour = new ArrayList<ResultatAnalyse>();
		MultiJeu(new File(nomDossier), duree, retour, fabriquePlateau,
				analyseEvolution);
		return retour;
	}

	/**
	 * fonction qui parcourt récursivement tout les sous-repertoires d'un
	 * repertoire donné en paramètre en analysant tout les fichiers que la
	 * FabriquePlateau arrivera à transformer en plateau
	 * 
	 * @param repertoire
	 *             repertoire à explorer
	 * @param duree
	 *            nombre d'étape pendant le quel un fichier peut être analysé avant de
	 *            retourner resultatIndetermine
	 * @param fabriquePlateau
	 *            FabriquePlateau qui sera utilisé sur les fichier
	 * @param analyseEvolution
	 *            AnalyseEvolution qui sera utilisé sur les plateaux que
	 *            fabriquePlateau aura pû créer
	 */
	private static void MultiJeu(File repertoire, int duree,
			List<ResultatAnalyse> retour, FabriquePlateau fabriquePlateau,
			AnalyseEvolution analyseEvolution) {

		if (!repertoire.isDirectory()) {
			String nom = repertoire.getName();
			try {
				ResultatAnalyse res = traitement(repertoire.getAbsolutePath(), duree,
						fabriquePlateau, analyseEvolution);
				res.setNom(nom);
				retour.add(res);
			} catch (LectureFichierException e) {

			}

		}
		if (repertoire.isDirectory()) {
			File[] list = repertoire.listFiles();

			if (list != null) {
				for (File f : list) {
					if (!f.isHidden()) {
						MultiJeu(f, duree, retour, fabriquePlateau,
								analyseEvolution);
					}
				}
			}
		}
	}

	/**
	 * Lit un fichier pour le transformer en plateau, l'analyse et retourne
	 * le résultat de l'analyse
	 * 
	 * @param cheminAbsolu
	 *            chemin absolu du fichier à analyser
	 * @param duree
	 *            nombre d'étape pendant le quel un fichier peut être analysé avant de
	 *            retourner resultatIndetermine
	 * @return le resultat de l'analyse
	 * @throws LectureFichierException
	 *             est levé si fabriquePlateau n'arrive 
	 *             pas à lire le fichier.
	 */
	private static ResultatAnalyse traitement(String cheminAbsolu, int duree,
			FabriquePlateau fabriquePlateau, AnalyseEvolution analyseEvolution)
			throws LectureFichierException {
		Plateau plateau = fabriquePlateau.fabriquerPlateau(cheminAbsolu);
		return analyseEvolution.analyse(plateau, duree);
	}

}
